/**
 * 常用工具方法类
 **/
import base from './util.base.js'

let tools = {
	/*
	 * @description 检测小程序更新
	 */
	VersionUpdate() {
		// 获取小程序更新机制兼容 
		if (uni.canIUse('getUpdateManager')) {
			const updateManager = uni.getUpdateManager()
			// 检查是否有新版本发布
			updateManager.onCheckForUpdate(function(res) {
				if (res.hasUpdate) {
					//小程序有新版本，则静默下载新版本，做好更新准备
					updateManager.onUpdateReady(function() {
						uni.showModal({
							title: '更新提示',
							content: '新版本已经准备好，是否重启应用？',
							success: function(res) {
								if (res.confirm) {
									//新的版本已经下载好，调用 applyUpdate 应用新版本并重启
									updateManager.applyUpdate()
								} else if (res.cancel) {
									//如果需要强制更新，则给出二次弹窗，如果不需要，则这里的代码都可以删掉了
									uni.showModal({
										title: '温馨提示',
										content: '我们已经做了新的优化，请及时更新哦~',
										showCancel: false, //隐藏取消按钮，也可显示，取消会走res.cancel，然后从新开始提示
										success: function(res) {
											//第二次提示后，强制更新           
											if (res.confirm) {
												// 新的版本已经下载好，调用 applyUpdate 应用新版本并重启
												updateManager.applyUpdate()
											}
											// else if (res.cancel) {
											// 重新回到版本更新提示
											// autoUpdate()
											// }
										}
									})
								}
							}
						})
					})
					// 新的版本下载失败
					updateManager.onUpdateFailed(function() {
						uni.showModal({
							title: '温馨提示',
							content: '新版本已经上线，请您删除当前小程序，重新搜索打开',
						})
					})
				}
			})
		} else {
			// 提示用户在最新版本的客户端上体验
			uni.showModal({
				title: '温馨提示',
				content: '当前微信版本过低，可能无法使用该功能，请升级到最新版本后重试。'
			})
		}
	},

	/**
	 * @description px转upx
	 * @param {string} val 要处理的数据
	 **/
	px2upx(val) {
		return val / (uni.upx2px(val) / val);
	},

	/**
	 * @description upx转px
	 * @param {string} val 要处理的数据
	 */
	upx2px(val) {
		return uni.upx2px(val);
	},
	/**
	 * @description 字符掩码
	 * @param {string} val 要处理的数据
	 * @param {int} start 掩码开始位置
	 * @param {int} end	掩码结束位置
	 */
	strFilter(val, start, end) {
		var str = val.trim() //去除空格
		let maskCode = str.substring(0, start) + '****' + str.slice(end, -1)
		// var maskCode=str.replace(str.substring(start, end), "****")
		return maskCode;
	},
	/**
	 * @description 获取链接参数
	 * @param {string} path 网址链接Url路径
	 * @param {string} name 参数名
	 */
	getUrlParam(path, name) {
		if (base.isNull(path)) {
			path = window.location.search
		}
		var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
		var r = path.substr(1).match(reg);
		if (r != null) return unescape(r[2]);
		return null;
	},
	/**
	 * @description 判断是否在微信内置浏览器
	 */
	isWechat() {
		let ua = navigator.userAgent.toLowerCase();
		if (ua.match(/MicroMessenger/i) == "micromessenger") {
			return true;
		} else {
			return false;
		}
	},
	/**
	 * @description 小程序的原生菜单中显示分享按钮
	 */
	showShareMenu() {
		// 小程序分享功能
		uni.showShareMenu({
			withShareTicket: true,
			//设置下方的Menus菜单，才能够让发送给朋友与分享到朋友圈两个按钮可以点击
			menus: ["shareAppMessage", "shareTimeline"] //不设置默认只能发送给朋友
		})
	},
	/**
	 * @description 对象数组去重
	 * @param {Array} arr 数组
	 * @param {String} key 去重的字段名
	 */
	uniqueArrayObject(arr = [], key = 'id') {
		console.log("去重对象")
		if (arr.length === 0) return
		let list = []
		const map = {}
		arr.forEach((item) => {
			if (!map[item[key]]) {
				map[item[key]] = item
			}
		})
		list = Object.values(map)
		return list
	},
	/**
	 * @description 遍历树节点
	 * @param {Array} tree 树数组
	 * @param {Function} callback 回调函数
	 * @param {String} childrenName 树节点名称
	 */
	/* 
	使用方式
	foreachTree(treeData, (item) => {
		if (item.id === 7) {
			datd = item
		}
    }) */
	foreachTree(tree, callback, childrenName = 'children') {

		for (let i = 0; i < tree.length; i++) {
			callback(tree[i])
			if (tree[i][childrenName] && tree[i][childrenName].length > 0) {
				this.foreachTree(tree[i][childrenName], callback, childrenName)
			}
		}
	},
	/**
	 * @description 金额格式化
	 * @param {number} number 		要格式化的数字
	 * @param {number} decimals		保留几位小数
	 * @param {string} dec_point		小数点符号
	 * @param {string} thousands_sep	千分位符号
	 */
	moneyFormat(number, decimals, dec_point, thousands_sep) {
		number = (number + '').replace(/[^0-9+-Ee.]/g, '')
		const n = !isFinite(+number) ? 0 : +number
		const prec = !isFinite(+decimals) ? 2 : Math.abs(decimals)
		const sep = typeof thousands_sep === 'undefined' ? ',' : thousands_sep
		const dec = typeof dec_point === 'undefined' ? '.' : dec_point
		let s = ''
		const toFixedFix = function(n, prec) {
			const k = Math.pow(10, prec)
			return '' + Math.ceil(n * k) / k
		}
		s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.')
		const re = /(-?\d+)(\d{3})/
		while (re.test(s[0])) {
			s[0] = s[0].replace(re, '$1' + sep + '$2')
		}

		if ((s[1] || '').length < prec) {
			s[1] = s[1] || ''
			s[1] += new Array(prec - s[1].length + 1).join('0')
		}
		return s.join(dec)
	},
	/**
	 * @description 获取一个随机数
	 * @param {Object} min
	 * @param {Object} max
	 */
	random(min, max) {
		switch (arguments.length) {
			case 1:
				return Math.floor(Math.random() * min + 1);
				break;
			case 2:
				return Math.floor(Math.random() * (max - min + 1) + min);
				break;
			default:
				return 0;
				break;
		}
	},
	/**
	 * @description 对象转params参数
	 * @param {Object} val
	 * @return {String} 
	 */
	parseParams(val) {
		const params = []
		if (typeof(val) == 'object') {
			Object.keys(val).forEach((key) => {
				let value = val[key]
				// 如果值为undefined我们将其置空
				if (typeof value === 'undefined') {
					value = ''
				}
				// 对于需要编码的文本（比如说中文）我们要进行编码
				params.push([key, encodeURIComponent(value)].join('='))
			})
		}
		return params.join('&')
	},
	/**
	 * @description 对象转params参数网址
	 * @param {String} url 路径
	 * @param {Object} val 对象参数
	 * @return {String} 
	 */
	parseParamUrl(url, val) {
		url = url || '/'
		let params = ''
		if (typeof(val) == 'object') {
			params = this.parseParams(val)
			params && (url += '?')
			url += params
		}
		return url
	},
	/**
	 * @description 获取url网址参数
	 * @param {String} val 路径
	 * @return {String} 
	 */
	getParams(url = '') {
		let obj = {}
		let params = url.split('?')[1]
		if (params != undefined) {
			let paramsList = params.split('&')
			paramsList.map(item => {
				obj[item.split('=')[0]] = item.split('=')[1]
			})
		}
		return obj
	},
	/**
	 * @description 判断两个对象是否相同
	 * @param {Object} param1 对象1
	 * @param {Object} param2 对象2
	 * @return {String} 
	 */
	objectEqual(param1, param2) {
		if (param1 === param2) {
			return true;
		} else if (typeof param1 == 'object' && param1 != null &&
			typeof param2 == 'object' && param2 != null) {

			if (Object.keys(param1).length != Object.keys(param2).length) return false;
			for (var prop in param1) {
				if (param2.hasOwnProperty(prop)) {
					if (!this.objectEqual(param1[prop], param2[prop])) return false;
				} else {
					return false;
				}
			}
			return true;
		} else {
			return false;
		}
	},
	/**
	 * @description 返回页面栈的实例
	 * @description this.utilTools.currentPage().address = item; this.utilNav.navigateBack();
	 * @param {Number} index 返回页数
	 */
	currentPage(index = 2) {
		//获取当前页面栈的实例
		let pages = getCurrentPages()
		// 上 index-1 页数据
		let page = pages[pages.length - index]
		// #ifdef H5
		return page
		// #endif
		return page
		// return page.$vm
	},
	/**
	 * @description 查询节点信息的对象
	 * @param {String} selector 匹配选择器
	 * @param {String} isAll 是否全部匹配
	 * @param {String} that this
	 */
	getRect(selector, isAll, that) {
		return new Promise((resolve) => {
			uni.createSelectorQuery()
				.in(that)[isAll ? 'selectAll' : 'select'](selector)
				.boundingClientRect((rect) => {
					if (isAll && Array.isArray(rect) && rect.length) {
						resolve(rect)
					}
					if (!isAll && rect) {
						resolve(rect)
					}
				}).exec()
		})
	},
	/**
	 * @description 动态设置tabBar
	 * @param {String}
	 */
	setTabBar() {
		let tabBar = theme.tabBarList.find(item => item.themeName == uni.getStorageSync('themeName'))
		let Theme = uni.getStorageSync('theme')
		uni.setTabBarStyle({
			selectedColor: Theme.split(/\;|\:/)[1],
		})
		if (uni.getStorageSync('themeName') != '') {
			console.log("触发了")
			uni.setTabBarItem({
				index: 0,
				text: '首页',
				// iconPath: tabBar.homeicon,
				// selectedIconPath: tabBar.home
			})
			uni.setTabBarItem({
				index: 1,
				text: '订单',
				// iconPath: tabBar.homeicon,
				// selectedIconPath: tabBar.home
			})
			uni.setTabBarItem({
				index: 2,
				text: '我的',
				// iconPath: tabBar.usericon,
				// selectedIconPath: tabBar.user
			})
		}
	},
	// 格式化时间
	dateFormat(fmt = 'YYYY-MM-DD', date = new Date()) {
		const time = new Date(date)
		const weekArr = ['日', '一', '二', '三', '四', '五', '六']
		var o = {
			'M+': time.getMonth() + 1, //月份
			'D+': time.getDate(), //日
			'h+': time.getHours(), //小时
			'm+': time.getMinutes(), //分
			's+': time.getSeconds(), //秒
			'q+': Math.floor((time.getMonth() + 3) / 3), //季度
			S: time.getMilliseconds(), //毫秒
			W: time.getDay(), //星期
		}
		if (/(Y+)/.test(fmt))
			fmt = fmt.replace(RegExp.$1, (time.getFullYear() + '').substr(4 - RegExp.$1.length))
		for (var k in o)
			if (new RegExp('(' + k + ')').test(fmt))
				fmt = fmt.replace(
					RegExp.$1,
					RegExp.$1 == 'W' ?
					weekArr[o[k]] :
					RegExp.$1.length == 1 ?
					o[k] :
					('00' + o[k]).substr(('' + o[k]).length)
				)
		return fmt
	}
}

export default tools;